/**
 * @author: Gene
 * @age: 永远18岁的美少年
 * @Email： yangjianyun@58.com
 * @date: 2021-11-16 22:09:31
 * @description: toStringTag 介绍:
 *  Symbol.toStringTag 是一个 内置 Symbol, 它通常作为对象的属性键使用, 对应的属性值为字符串类型,  这个字符串用来表示该对象的自定义类型标签
 *  通常只有内置的 Object.prototype.toString() 方法会去读取这个标签, 并把它包含在自己的返回值里.
 */
console.log(Object.prototype.toString.call("foo")); // [object String]
console.log(Object.prototype.toString.call([])); // [object Array]
console.log(Object.prototype.toString.call(1)); // [object Number]
console.log(Object.prototype.toString.call(true)); // [object Boolean]
console.log(Object.prototype.toString.call(undefined)); // [object Undefined]
console.log(Object.prototype.toString.call(null)); // [object Null]
console.log(Object.prototype.toString.call({})); // [object Object]

let obj1 = {}
let obj2 = {}
// 问题: obj1 和 obj2 的类型都是  [object Object], 那么它们两个的类型又怎么区分呢?
// Symbol.toStringTag 更好的去表示 对象的类型., 即Object.prototype.toString.call({}),实际上是读取的 {} 对象的 Symbol.toStringTag

Object.defineProperty(obj1, Symbol.toStringTag, {value: "Obj1"})
Object.defineProperty(obj2, Symbol.toStringTag, {value: "Obj2"})
console.log(Object.prototype.toString.call(obj1)); // [object obj1]
console.log(Object.prototype.toString.call(obj2)); // [object obj2]
